package com.hello.system.controller.app;

import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.hello.common.core.web.controller.BaseController;
import com.hello.common.core.web.domain.AjaxResult;
import com.hello.common.core.web.page.TableDataInfo;
import com.hello.system.domain.RentalDeviceProducts;
import com.hello.system.service.IRentalDeviceProductsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * App端设备产品接口
 * 
 * @author hello
 * @date 2025-01-03
 */
@Slf4j
@RestController
@RequestMapping("/app/products")
@RequiredArgsConstructor
public class AppRentalDeviceProductsController extends BaseController
{
    private final IRentalDeviceProductsService rentalDeviceProductsService;

    /**
     * 获取商品列表（App端专用）
     * 只返回审核通过且上架的商品
     * 
     * @param productName 产品名称（模糊搜索）
     * @param brand 品牌
     * @param categoryId 分类ID
     * @param minPrice 最低日租金
     * @param maxPrice 最高日租金
     * @param isBuyable 是否支持购买：0-仅租赁，1-支持购买
     * @param qualityGrade 质量等级：A-全新，B-99新，C-95新，D-90新
     * @param serviceArea 服务区域（模糊匹配）
     * @return 商品列表
     */
    @GetMapping("/list")
    public TableDataInfo getProductList(
            @RequestParam(value = "productName", required = false) String productName,
            @RequestParam(value = "brand", required = false) String brand,
            @RequestParam(value = "categoryId", required = false) Long categoryId,
            @RequestParam(value = "minPrice", required = false) java.math.BigDecimal minPrice,
            @RequestParam(value = "maxPrice", required = false) java.math.BigDecimal maxPrice,
            @RequestParam(value = "isBuyable", required = false) Integer isBuyable,
            @RequestParam(value = "qualityGrade", required = false) String qualityGrade,
            @RequestParam(value = "serviceArea", required = false) String serviceArea)
    {
        log.info("======== App端获取商品列表请求 ========");
        log.info("查询条件 - 产品名称: {}, 品牌: {}, 分类ID: {}, 价格区间: {}-{}, 是否支持购买: {}, 质量等级: {}, 服务区域: {}", 
                productName, brand, categoryId, minPrice, maxPrice, isBuyable, qualityGrade, serviceArea);
        
        startPage();
        
        // 构建查询条件
        RentalDeviceProducts queryParam = new RentalDeviceProducts();
        queryParam.setProductName(productName);
        queryParam.setBrand(brand);
        queryParam.setCategoryId(categoryId);
        queryParam.setIsBuyable(isBuyable);
        queryParam.setQualityGrade(qualityGrade);
        
        // 只查询审核通过且上架的商品
        queryParam.setAuditStatus(1); // 审核通过
        queryParam.setStatus(1);      // 上架状态
        queryParam.setSaleStatus(1);  // 正常销售
        
        // 查询商品列表
        List<RentalDeviceProducts> list = rentalDeviceProductsService.selectRentalDeviceProductsList(queryParam);
        
        // 过滤价格区间和服务区域（这些条件需要在业务层处理）
        if (minPrice != null || maxPrice != null || serviceArea != null) {
            list = list.stream()
                    .filter(product -> {
                        // 价格区间过滤
                        if (minPrice != null && product.getBaseDailyRent().compareTo(minPrice) < 0) {
                            return false;
                        }
                        if (maxPrice != null && product.getBaseDailyRent().compareTo(maxPrice) > 0) {
                            return false;
                        }
                        // 服务区域过滤（模糊匹配）
                        if (serviceArea != null && product.getServiceAreas() != null) {
                            return product.getServiceAreas().contains(serviceArea);
                        }
                        return true;
                    })
                    .collect(java.util.stream.Collectors.toList());
        }
        
        log.info("查询到商品数量: {}", list.size());
        
        return getDataTable(list);
    }

    /**
     * 获取商品详情（App端专用）
     * 
     * @param productId 产品ID
     * @return 商品详细信息
     */
    @GetMapping("/{productId}")
    public AjaxResult getProductDetail(@PathVariable("productId") Long productId)
    {
        log.info("======== App端获取商品详情请求 ========");
        log.info("产品ID: {}", productId);
        
        RentalDeviceProducts product = rentalDeviceProductsService.selectRentalDeviceProductsByProductId(productId);
        
        if (product == null) {
            log.warn("商品不存在: {}", productId);
            return AjaxResult.error("商品不存在");
        }
        
        // 检查商品状态（只返回审核通过且上架的商品）
        if (product.getAuditStatus() != 1 || product.getStatus() != 1 || product.getSaleStatus() != 1) {
            log.warn("商品不可用: {} - 审核状态: {}, 产品状态: {}, 销售状态: {}", 
                    productId, product.getAuditStatus(), product.getStatus(), product.getSaleStatus());
            return AjaxResult.error("商品暂不可用");
        }
        
        // 增加浏览次数
        try {
            product.setViewCount(product.getViewCount() != null ? product.getViewCount() + 1 : 1);
            rentalDeviceProductsService.updateRentalDeviceProducts(product);
        } catch (Exception e) {
            log.warn("更新浏览次数失败: {}", e.getMessage());
        }
        
        log.info("返回商品详情: {}", product.getProductName());
        
        return AjaxResult.success("获取商品详情成功", product);
    }

    /**
     * 获取热门商品列表（App端专用）
     * 按浏览次数和评分排序
     * 
     * @param limit 返回数量限制，默认10个
     * @return 热门商品列表
     */
    @GetMapping("/hot")
    public AjaxResult getHotProducts(@RequestParam(value = "limit", defaultValue = "10") Integer limit)
    {
        log.info("======== App端获取热门商品请求 ========");
        log.info("限制数量: {}", limit);
        
        // 构建查询条件：只查询审核通过且上架的商品
        RentalDeviceProducts queryParam = new RentalDeviceProducts();
        queryParam.setAuditStatus(1); // 审核通过
        queryParam.setStatus(1);      // 上架状态
        queryParam.setSaleStatus(1);  // 正常销售
        
        List<RentalDeviceProducts> list = rentalDeviceProductsService.selectRentalDeviceProductsList(queryParam);
        
        // 按浏览次数和评分排序，取前N个
        List<RentalDeviceProducts> hotProducts = list.stream()
                .sorted((p1, p2) -> {
                    // 综合排序：浏览次数权重70%，评分权重30%
                    long viewCount1 = p1.getViewCount() != null ? p1.getViewCount() : 0;
                    long viewCount2 = p2.getViewCount() != null ? p2.getViewCount() : 0;
                    
                    java.math.BigDecimal rating1 = p1.getAvgRating() != null ? p1.getAvgRating() : java.math.BigDecimal.ZERO;
                    java.math.BigDecimal rating2 = p2.getAvgRating() != null ? p2.getAvgRating() : java.math.BigDecimal.ZERO;
                    
                    double score1 = viewCount1 * 0.7 + rating1.doubleValue() * 0.3 * 100;
                    double score2 = viewCount2 * 0.7 + rating2.doubleValue() * 0.3 * 100;
                    
                    return Double.compare(score2, score1); // 降序
                })
                .limit(limit)
                .collect(java.util.stream.Collectors.toList());
        
        log.info("返回热门商品数量: {}", hotProducts.size());
        
        return AjaxResult.success("获取热门商品成功", hotProducts);
    }

    /**
     * 搜索商品（App端专用）
     * 支持关键词搜索
     * 
     * @param keyword 搜索关键词
     * @return 搜索结果
     */
    @GetMapping("/search")
    public TableDataInfo searchProducts(@RequestParam("keyword") String keyword)
    {
        log.info("======== App端搜索商品请求 ========");
        log.info("搜索关键词: {}", keyword);
        
        if (keyword == null || keyword.trim().isEmpty()) {
            log.warn("搜索关键词为空");
            return getDataTable(java.util.Collections.emptyList());
        }
        
        startPage();
        
        // 构建查询条件：只查询审核通过且上架的商品
        RentalDeviceProducts queryParam = new RentalDeviceProducts();
        queryParam.setAuditStatus(1); // 审核通过
        queryParam.setStatus(1);      // 上架状态
        queryParam.setSaleStatus(1);  // 正常销售
        
        List<RentalDeviceProducts> allProducts = rentalDeviceProductsService.selectRentalDeviceProductsList(queryParam);
        
        // 关键词搜索（在产品名称、品牌、描述、标签、关键词中搜索）
        String searchKeyword = keyword.toLowerCase().trim();
        List<RentalDeviceProducts> searchResults = allProducts.stream()
                .filter(product -> {
                    // 在多个字段中搜索关键词
                    return (product.getProductName() != null && product.getProductName().toLowerCase().contains(searchKeyword)) ||
                           (product.getBrand() != null && product.getBrand().toLowerCase().contains(searchKeyword)) ||
                           (product.getDescription() != null && product.getDescription().toLowerCase().contains(searchKeyword)) ||
                           (product.getTags() != null && product.getTags().toLowerCase().contains(searchKeyword)) ||
                           (product.getKeywords() != null && product.getKeywords().toLowerCase().contains(searchKeyword));
                })
                .collect(java.util.stream.Collectors.toList());
        
        log.info("搜索到商品数量: {}", searchResults.size());
        
        return getDataTable(searchResults);
    }

    /**
     * 获取推荐商品（App端专用）
     * 基于用户可能感兴趣的商品推荐
     * 
     * @param categoryId 分类ID（可选，基于分类推荐）
     * @param limit 返回数量限制，默认10个
     * @return 推荐商品列表
     */
    @GetMapping("/recommend")
    public AjaxResult getRecommendProducts(
            @RequestParam(value = "categoryId", required = false) Long categoryId,
            @RequestParam(value = "limit", defaultValue = "10") Integer limit)
    {
        log.info("======== App端获取推荐商品请求 ========");
        log.info("分类ID: {}, 限制数量: {}", categoryId, limit);
        
        // 构建查询条件：只查询审核通过且上架的商品
        RentalDeviceProducts queryParam = new RentalDeviceProducts();
        queryParam.setAuditStatus(1); // 审核通过
        queryParam.setStatus(1);      // 上架状态
        queryParam.setSaleStatus(1);  // 正常销售
        
        if (categoryId != null) {
            queryParam.setCategoryId(categoryId);
        }
        
        List<RentalDeviceProducts> list = rentalDeviceProductsService.selectRentalDeviceProductsList(queryParam);
        
        // 推荐算法：综合评分、租赁次数、收藏次数进行推荐
        List<RentalDeviceProducts> recommendProducts = list.stream()
                .sorted((p1, p2) -> {
                    // 综合推荐分数：评分40%，租赁次数30%，收藏次数30%
                    java.math.BigDecimal rating1 = p1.getAvgRating() != null ? p1.getAvgRating() : java.math.BigDecimal.ZERO;
                    java.math.BigDecimal rating2 = p2.getAvgRating() != null ? p2.getAvgRating() : java.math.BigDecimal.ZERO;
                    
                    long rentCount1 = p1.getRentCount() != null ? p1.getRentCount() : 0;
                    long rentCount2 = p2.getRentCount() != null ? p2.getRentCount() : 0;
                    
                    long favoriteCount1 = p1.getFavoriteCount() != null ? p1.getFavoriteCount() : 0;
                    long favoriteCount2 = p2.getFavoriteCount() != null ? p2.getFavoriteCount() : 0;
                    
                    double score1 = rating1.doubleValue() * 0.4 * 20 + rentCount1 * 0.3 + favoriteCount1 * 0.3;
                    double score2 = rating2.doubleValue() * 0.4 * 20 + rentCount2 * 0.3 + favoriteCount2 * 0.3;
                    
                    return Double.compare(score2, score1); // 降序
                })
                .limit(limit)
                .collect(java.util.stream.Collectors.toList());
        
        log.info("返回推荐商品数量: {}", recommendProducts.size());
        
        return AjaxResult.success("获取推荐商品成功", recommendProducts);
    }
}